package com.enlorenz.core.engine;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.enlorenz.core.engine.exception.EngineControlException;

/**
 * Engine抽象类
 * 实现部分公共功能
 * @author lcb
 */
public abstract class AbstractEngine implements IEngine{
	//日志对象 实现类可复用此日志对象
	protected Logger logger=LoggerFactory.getLogger(this.getClass());
	//engine名称 如果没有设置,默认是类路径
	private String name=this.getClass().getName();
	
	/**
	 * 强制重启
	 * 强制重启必须重新加载一次参数
	 */
	@Override
	public void forceRestart() throws EngineControlException {
		//1.先关闭
		shutdown();
		//2.初始化
		init();
		//3.启动
		start();
	}
	
	/**
	 * 重启
	 */
	@Override
	public void restart() throws EngineControlException{
		//1.关闭
		shutdown();
		//2.启动
		start();
	}
	
	/**
	 * 初始化
	 */
	@Override
	public void init() throws EngineControlException {
		try{
			initEngine();
		}catch (Exception e) {
			throw new EngineControlException(this.getName(),e);
		}
	}

	/**
	 * 关闭
	 */
	@Override
	public void shutdown() throws EngineControlException {
		try{
			shutdownEngine();
		}catch (Exception e) {
			throw new EngineControlException(this.getName(),e);
		}
	}
	
	/**
	 * 启动
	 */
	@Override
	public void start() throws EngineControlException {
		try{
			startEngine();
		}catch (Exception e) {
			throw new EngineControlException(this.getName(),e);
		}
	}

	/**
	 * 设置名称
	 * @param name
	 */
	public void setName(String name){
		this.name=name;
	}
	/**
	 * 获取名称
	 * @return
	 */
	public String getName(){
		return name;
	}
	/**
	 * 需要实现的初始化方法
	 * @throws Exception
	 */
	protected abstract void initEngine() throws Exception;
	/**
	 * 需要实现的启动方法
	 * @throws Exception
	 */
	protected abstract void startEngine() throws Exception;
	/**
	 * 需要实现的关闭方法
	 * @throws Exception
	 */
	protected abstract void shutdownEngine() throws Exception;
	
}
